<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /* 
        -   浅拷贝：只拷贝最外面一层的数据；更深层次的对象(对象里面的引用数据类型)，只拷贝引用。

        -   深拷贝：拷贝多层数据；每一层级别的数据都会拷贝。
       */
        // for in 实现浅拷贝
        const obj1 = {
            name: 'qianguyihao',
            age: 28,
            info: {
                desc: '很厉害',
            },
        };

        const obj2 = {};
        //  用 for in 将 obj1 的值拷贝给 obj2
        for (let key in obj1) {
            obj2[key] = obj1[key];
        }

        console.log('obj2', obj2);

        obj1.info.desc = '永不止步'; // 当修改 obj1 里的引用数据类型的时候，obj2的值也会被改变。所以  for in 是浅拷贝（只拷贝引用）

        console.log('obj2', obj2);



        // Object.assign(target,source)方法用于对象的合并，将源对象（source）的所有可枚举属性，复制到目标对象（target）。
        // object.assgin实现浅拷贝 
        // 将`obj1` 拷贝给 `obj2`。执行完毕后，obj2 的值会被更新
        // 将 obj1 的值追加到 obj2 中。如果对象里的属性名相同，会被覆盖。


        const obj3 = Object.assign({}, obj1)
        obj1.info.desc = 'sb'
        obj3.name = 'chen'
        console.log('obj3', obj3); //obj3的info仍然发生改变 还是浅拷贝 由于在堆里面创建了新的对象，可以保存自己的name

        // 另一个写法 ，这样写obj31===obj32
        const obj31 = {};
        const obj32 = Object.assign(obj31, obj3);

        // 2.两个对象赋值给一个空对象 重名的属性会覆盖
        const obj4 = {
            name: 'lin',
            age: 32
        }
        const obj5 = {
            name: 'lzz',
            sex: 1
        }
        const obj6 = {}
        // 重名的属性会覆盖 按obj5 obj4的先后顺序
        console.log('obj6', Object.assign(obj6, obj5, obj4));

        // 3.合并两个对象
        const obj7 = {
            name: 'linzejia',
            age: 22
        }
        const obj8 = {
            name: 'sb',
            address: 'guanzghou'
        }
        // obj8的属性合并到obj7里面 如果有重名 就覆盖
        Object.assign(obj7, obj8);
        console.log('obj7', obj7);


        // 深拷贝：深拷贝其实就是将浅拷贝进行递归。 
        function deepCopy(newValue, oldValue) {
            for(var key in oldValue){
                const item = oldValue[key]
                if(item instanceof Array){
                    newValue[key] = []
                    return deepCopy(newValue[key],item)
                }else if(item instanceof Object){
                    newValue[key]={}
                    return deepCopy(newValue[key],item)
                }else{
                    // 如果是基础数据类型，直接赋值
                    newValue[key]=item
                }
            }
        }
        obj9={
            name:'hong',
            info:{
                address:'my'
            },
            fun : function speak(){
                console.log('aaa');
            }
        }
        const obj10 = {}
        deepCopy(obj10,obj9)
        obj9.info.address='sb'
        console.log(obj10);
    </script>
</body>

</html>